PROGRAM BIDON

! ce programme calcule f(x,y) = sin (pi x)  * sin (pi x) sur un carre unite
! avec nx, ny et sort le resultat dans un fichier
!
  INTEGER NMAX
  PARAMETER(NMAX=100)

  INTEGER NX, NY
!
! Attention a la longueur du nom des fichiers
!
  CHARACTER*21 FICHIER_SOLUTION_EXACTE
  CHARACTER*21 FICHIER_SOLUTION_CALCULEE
!
  DOUBLE PRECISION, ALLOCATABLE :: F(:,:)
  DOUBLE PRECISION, ALLOCATABLE :: S(:,:)
!
  REAL T1(2)
  REAL TEMPS
!
! Lecture du fichier de donnees
!
  OPEN(FILE='data',UNIT=7)
  READ(7,*) NX
  READ(7,*) NY
  READ(7,*) FICHIER_SOLUTION_EXACTE
  READ(7,*) FICHIER_SOLUTION_CALCULEE
  CLOSE(7)
!
! Allocation des tableaux
!
  ALLOCATE(F(NX,NY), S(NX,NY))
!
! Calcul de la solution exacte (plusieurs fois pour augmenter le temps)
!
!     initialisation du temps
!
  TEMPS =  DTIME(T1)
  DO K = 1, 10000
    CALL CALCUL(F,NX,NY)
  ENDDO
!
  TEMPS =  DTIME(T1)

  WRITE(*,*)
  WRITE(*,*) "###############################################"
  WRITE(*,*) "       taille : ", NX, " x ", NY
  WRITE(*,*) "###############################################"
  WRITE(*,*)
  WRITE(*,*) 'temps de restitution calcul solution exacte'
  WRITE(*,*) '            (total,user,systeme)'
  WRITE(*,*) TEMPS,T1(1),T1(2)

! Sauvegarde de la solution exacte
!
  OPEN(FILE=FICHIER_SOLUTION_EXACTE,UNIT=8)
!
  WRITE(8,*) NX
  WRITE(8,*) NY
!
  DO J = 1, NY
    DO I = 1, NX
      WRITE(8,*) F(I,J)
    ENDDO
  ENDDO
!
  CLOSE(8)
!
! On perturbe la solution pour simuler la solution calculee
! (plusieurs fois pour augmenter le temps)
!
!
  TEMPS =  DTIME(T1)
!
  DO K = 1, 10000
    CALL PERTURBATION(F,S,NX,NY)
  ENDDO
!
  TEMPS =  DTIME(T1)

  WRITE(*,*) "--------------------------------------------------"
  WRITE(*,*) 'temps de restitution calcul solution approchee'
  WRITE(*,*) '            (total,user,systeme)'
  WRITE(*,*)
  WRITE(*,*) TEMPS,T1(1),T1(2)
  WRITE(*,*)
  WRITE(*,*) 'Remarquez la difference avec le calcul!'
  WRITE(*,*) '(utilisation des fcts trigo dans le premier cas)'
  WRITE(*,*)
!
! Sauvegarde de la solution perturbee
!
  OPEN(FILE=FICHIER_SOLUTION_CALCULEE,UNIT=8)
!
  WRITE(8,*) NX
  WRITE(8,*) NY
!
  DO J = 1, NY
    DO I = 1, NX
      WRITE(8,*) S(I,J)
    ENDDO
  ENDDO
!
  CLOSE(8)
!
  TEMPS = ETIME(T1)

  WRITE(*,*) "--------------------------------------------------"
  WRITE(*,*)
  WRITE(*,*) 'temps total du programme'
  WRITE(*,*) '  (total,user,systeme)'
  WRITE(*,*)
  WRITE(*,*) TEMPS,T1(1),T1(2)
  WRITE(*,*)
  WRITE(*,*) "--------------------------------------------------"
  WRITE(*,*)
!
  END
!
!     routine de perturbation
! 
  SUBROUTINE PERTURBATION(F,S,NX,NY)
!
!     Arguments
!       F : IN solution exacte
!       S : OUT solution perturbee
!       NX, NY : IN : les dimensions utiles des vecteurs F et S
!
  DOUBLE PRECISION F(NX,NY)
  DOUBLE PRECISION S(NX,NY)
  INTEGER NX,NY
!
!     Variables locales
!
  DOUBLE PRECISION,ALLOCATABLE :: P(:,:)
!
  ALLOCATE(P(SIZE(F,1),SIZE(F,2)))
!
  DO J = 1, NY
    DO I = 1, NX
      P(I,J) = 0.001 * (NX-I) * (NY-J)
    ENDDO
  ENDDO
!
  DO J = 1, NY
    DO I = 1, NX
      S(I,J) = F(I,J) + P(I,J)
    ENDDO
  ENDDO
!
  DEALLOCATE(P)
!
  RETURN
!
  END
